<?php

namespace Condistelec\MainBundle\Controller;

use Condistelec\MainBundle\Entity\Partida;

use Condistelec\MainBundle\Entity\Usuario;
use Condistelec\MainBundle\Entity\Perfil;
use Condistelec\MainBundle\Entity\Registro;
use Condistelec\MainBundle\Entity\Juego;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\Forms;
use JMS\SecurityExtraBundle\Annotation\Secure;

class RegistroUsuarioController extends Controller
{
	const PATH_CONFIRMACION = '/confirmacion/';
	
	/**
	 * @Route("/registro", name = "_cond_app_registo_usr")
	 * @Template()
	 */
	public function registroAction()
	{
		$em = $this->getDoctrine()->getEntityManager();
		$usuario = new Usuario();

		$form = $this->createFormBuilder($usuario)
		->add('email', null, array('label' => 'E-Mail',  "required" => true))
		->add('nombre', null, array('label' => 'Nombre',  "required" => true))
		->add('apellido', null, array('label' => 'Apellido',  "required" => true))
		->add('telefono', null, array('label' => 'Teléfono',  "required" => true))
		->add('celular', null, array('label' => 'Celular',  "required" => false))
		->add('direccion', null, array('label' => 'Dirección',  "required" => true))
		->add('localidad', null, array('label' => 'Localidad',  "required" => true))
		->add('password', 'repeated', array(
           			'first_name' => 'Password',
           			'second_name' => 'Confirmar',
           			'type' => 'password','invalid_message' => 'Error de confirmacion'
           			))->getForm();
        $errores =  $this->initErrors();
		if ($this->getRequest()->getMethod() === 'POST') {
			$form->handleRequest($this->getRequest());
    		
    		if ($form->isValid()) {
    			$validationResult = $this->validateUsuario($usuario, $errores);
    			$errores = $validationResult['errores'];

    			if($validationResult['valid'])
    			{
    				$usuario->setEstado(Usuario::ESTADO_SIN_CONFIRMAR);
	    			$perfil = $em->getRepository('CondistelecMainBundle:Perfil')->find(Perfil::PERFIL_USUARIO);
	    			$usuario->setPerfil($perfil);
	    			$em->persist($usuario);
	    			$em->flush();
	    			
	    			$registro = $this->generarRegistro($usuario->getId());
	    			$em->persist($registro);
	    			$em->flush();
	    			
	    			$this->sendEmail($usuario->getNombre(), $usuario->getEmail(), $this->generarLinkValidacion($registro->getValorRegistro()));
	    			
	    			return $this->redirect($this->generateUrl('_cond_app_registo_landing'));
    			}
    			
    		}

        }
        return array('form' => $form->createView(), 'errores' => $errores);
	}

	private function initErrors() {
		$errores = array();
		$errores['email'] = "";
		$errores['nombre'] = "";
		$errores['apellido'] = "";
		$errores['telefono'] = "";
		$errores['celular'] = "";
		$errores['direccion'] = "";
		$errores['localidad'] = "";
		$errores['password'] = "";
		return $errores;
	}
	
	public function validateUsuario(Usuario $usr, $errores){
    	$ret = true;
    	$em = $this->getDoctrine()->getEntityManager();    		
    	$user = $this->getDoctrine()->getRepository('CondistelecMainBundle:Usuario')->findOneBy(array('email' => $usr->getEmail()));
    	if ($user != null){
    		$ret = false;
    		$errores['email'] = "Email registrado";
    	} 
    	if($usr->getPassword() == null || $usr->getPassword() == '')
		{
			$ret = false;
    		$errores['password'] = "Debe completar este campo";
		}
    	if($usr->getEmail() == null || $usr->getEmail() == '')
		{
			$ret = false;
    		$errores['email'] = "Debe completar este campo";
		}
    	if($usr->getNombre() == null || $usr->getNombre() == '')
		{
			$ret = false;
    		$errores['nombre'] = "Debe completar este campo";
		}

		if($usr->getApellido() == null || $usr->getApellido() == '')
		{
			$ret = false;
    		$errores['apellido'] = "Debe completar este campo";
		}   

		if($usr->getTelefono() == null || $usr->getTelefono() == '')
		{
			$ret = false;
    		$errores['telefono'] = "Debe completar este campo";
		}elseif (!preg_match('/^[0-9]{6,14}$/',$usr->getTelefono()))
		{
			$ret = false;
    		$errores['telefono'] = "El valor ingresado no es válido";
		}

		if($usr->getCelular() == null || $usr->getCelular() == '')
		{
			$ret = false;
    		$errores['celular'] = "Debe completar este campo";
		}elseif (!preg_match('/^[0-9]{6,14}$/',$usr->getCelular()))
		{
			$ret = false;
    		$errores['celular'] = "El valor ingresado no es válido";
		}

		if($usr->getDireccion() == null || $usr->getDireccion() == '')
		{
			$ret = false;
    		$errores['direccion'] = "Debe completar este campo";
		}  

		if($usr->getLocalidad() == null || $usr->getLocalidad() == '')
		{
			$ret = false;
    		$errores['localidad'] = "Debe completar este campo";
		}  

    	return array('valid'=> $ret, 'errores' => $errores); 
    }
   
	/**
	 * @Route("registro/confirmacion/{numeroRegistro}")
	 * @Template()
	 */
	public function confirmacionAction($numeroRegistro)
	{
		$em = $this->getDoctrine()->getEntityManager();
			
		$reg = $em->getRepository('CondistelecMainBundle:Registro')->find($numeroRegistro);

		$success = false;
		
		if($reg != null) {
			$usr = $em->getRepository('CondistelecMainBundle:Usuario')->find($reg->getIdUsuario());
			$usr->setEstado(Usuario::ESTADO_CONFIRMADO);
			
			$em->remove($reg);
    		$em->persist($usr);
    		$em->flush();
    		
    		$this->crearPartida($usr);
    		
			$success = true;
		}
		return array('success' => $success);
	}

	private function crearPartida($usr) 
	{
		$em = $this->getDoctrine()->getEntityManager();
		$juego = $em->getRepository('CondistelecMainBundle:Juego')->find(1);
		
		$partida = new Partida();
		$partida->setErrores(0);
		$partida->setAciertos(0);
		$partida->setIntentos(1);
		$partida->setEstado(Partida::ESTADO_ACTIVO);
		$partida->setJuego($juego);
		$partida->setSerieActual(1);
		$partida->setTiempoAcum(0);
		$partida->setUsuario($usr);
		
		$em->persist($partida);
    	$em->flush();
	}
	/**
	 * @Route("/registro/landing", name = "_cond_app_registo_landing")
	 * @Template()
	 */
	public function landingAction()
	{
		return array();
	}
	
	private function generarRegistro($idUsuario)
	{
		$reg = new Registro();
		$reg->setIdUsuario($idUsuario);
		$rnd = rand ( 0 , 99999999999 );
		$reg->setValorRegistro($rnd);
		return $reg;
	}

	private function generarLinkValidacion($key)
	{
		return $this->getRequest()->getUri() . RegistroUsuarioController::PATH_CONFIRMACION . $key;
	}
    
	public function sendEmail($nombre, $email, $link) 
    {
    	$message = \Swift_Message::newInstance()
        ->setSubject('Confirmación de cuenta | Condistelec')
        ->setFrom('no-reply@juegocondistelec.com.ar')
        ->setTo($email)
        ->setBody($this->renderView(
                'CondistelecMainBundle:RegistroUsuario:registroEmail.txt.twig',
                array('nombre' => $nombre, 'email' => $email, 'link' => $link)));
    	$this->get('mailer')->send($message);
    }

     
}
